Hieronder heb ik een computer vision blob detectie analyse gedaan op morris watermaze data met behulp van opencv met python als codebase. Het morris watermaze is een grote bak met wit gekleurt water met daarin een klein tableau net onder de waterlijn waardoor het niet goed zichtbaar is. Hier worden over een paar dagen tijd ratten geleerd dat er een tableau is onder het water waar ze op kunnen staan en dus niet hoeven te zwemmen, dat vinden ze fijn en willen ze dus zo snel mogelijk bereiken. de manier waarop ze zoeken naar het tableau is interresant voor de onderzoekers. De analyse werd voorheen gedaan door de video af te spelen op een beeldscherm en daar dan een papier overheen te houden en dan de route van de rat overtekenen terwijl dit gebeurt. Dit is natuurlijk niet heel erg handig en kan sneller.
Het doel van dit script is om ratten die in het water zitten automatisch te volgen met computer vision. Hiervoor wordt als eerste de video ingeladen waarna er een witte cirkel om de waterbak heen getekent wordt zodat de achtergrond niet interfereerd met de blob detectie “OpenCV Python Tutorial #4 - Drawing (Lines, Images, Circles & Text)” (n.d.). Daarna moet de video van BGR naar HSV omgezet worden omdat de blob detectie niet werkt op bgr format “OpenCV Python Tutorial #5 - Colors and Color Detection” (n.d.). Daarna worden de uiterste kleuropties bepaald voor de mask die bepaald gaat worden “HTML Color Picker” (n.d.). De mask geeft een binaire video waar als de mask overeenkomt daar een 1 staat en het anders een 0 wordt “OpenCV Python Tutorial #5 - Colors and Color Detection” (n.d.). Hierna wordt er een blobdetectie op uitgevoerd waarbij het centrum van de blob gevonden wordt “How to Detect Colors in OpenCV [Python]” (n.d.) waarna hier een cirkel omheen getekent kan worden “OpenCV: Contour Features” (n.d.). Hierna wordt deze aangepaste video opgeslagen als .avi bestand “Capture and Save Video Using OpenCV Python” (n.d.). Dit kan dan het gemakkelijkst met VLC mediaplayer omgezet worden naar een .mp4 bestand “How to Convert AVI to Mp4 Using VLC Media Player” (n.d.) wat daarna embed kan worden in deze markdown “Embed_video: Embed Video in R Markdown Documents in Mccarthy-m-g/Embedr: Embed Multimedia Files in HTML Documents” (n.d.).
Het volgende doel van dit experiment zou zijn om in plaats van een verplaatsende cirkel een blijvende lijn te tekenen zodat dit in 1 keer opgeslagen zou kunnen worden als .jpeg.
import cv2
import numpy as np
cap = cv2.VideoCapture('0115_LH39_d1_t4.mp4') # laad de video in
out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc(*'MJPG'), 30.0, (int(cap.get(3)), int(cap.get(4))))
while True:
# leest de afbeelding van de video
ret, frame = cap.read()
# teken een cirkel zodat de achtergrond niet wordt meegenomen in de mask
img = cv2.circle(frame, (640,480), 660, (255,255,255), 400)
# zet afbeelding om van bgr naar hsv zodat opencv er mee kan werken
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# bepaal de uiterste kleuren voor de mask
dark_black = np.array([0, 0, 0])
light_black = np.array([0, 0, 60])
# de mask bepaalt welke kleuren in range zijn en maakt hier een binaire afbeelding van
mask = cv2.inRange(hsv, dark_black, light_black)
result = cv2.bitwise_and(frame, frame, mask=mask)
# vind de contouren
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if len(contours) !=0:
for contour in contours:
if cv2.contourArea(contour) > 500:
(x, y), radius = cv2.minEnclosingCircle(contour)
center = (int(x), int(y))
radius = int(radius)
cv2.circle(frame, center, radius, (0,255,0), 4)
# sla de video op
out.write(frame)
# laat de video zien in een popup als watermaze result
cv2.imshow('watermaze result', frame)
# als je op q drukt sluit de loop vroegtijdig af
if cv2.waitKey(1) == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
Hieronder is de input file te zien.